home *** CD-ROM | disk | FTP | other *** search
/ Resource Library: Multimedia / Resource Library: Multimedia.iso / maestro / source / quotemkr / quotemkr.c < prev    next >
Encoding:
Text File  |  1993-06-15  |  54.8 KB  |  1,730 lines

  1. /*
  2.  * Copyright (c) 1990, 1991, 1992 Stanford University
  3.  *
  4.  * Permission to use, copy, modify, and distribute this software and 
  5.  * its documentation for any purpose is hereby granted without fee, provided
  6.  * that (i) the above copyright notices and this permission notice appear in
  7.  * all copies of the software and related documentation, and (ii) the name
  8.  * Stanford may not be used in any advertising or publicity relating to
  9.  * the software without the specific, prior written permission of
  10.  * Stanford.
  11.  * 
  12.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
  13.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
  14.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
  15.  *
  16.  * IN NO EVENT SHALL STANFORD BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
  17.  * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
  18.  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT
  19.  * ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY,
  20.  * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
  21.  * SOFTWARE.
  22.  */
  23.  
  24. /* $Header: /Source/Media/collab/QuoteMaker/RCS/QuoteMaker.c,v 2.16 92/09/25 13:55:32 drapeau Exp $ */
  25. /* $Log:    QuoteMaker.c,v $
  26.  * Revision 2.16  92/09/25  13:55:32  drapeau
  27.  * Fixed errors in the way the quoted text window was being located.  The
  28.  * earlier version used the XView attributes "XV_WIDTH", "XV_HEIGHT", "XV_X",
  29.  * and "XV_Y".  This version now uses the more proper "frame_get_rect()" and
  30.  * "frame_set_rect()" functions for window placement and sizing.
  31.  * Also, some cosmetic changes were made to enhance readability and ANSI
  32.  * compliance.
  33.  * 
  34.  * Revision 2.15  92/09/12  18:43:00  drapeau
  35.  * Replaced non-portable "irint()" function with simple cast-to-integer syntax.
  36.  * 
  37.  * Revision 2.14  92/06/15  14:32:50  drapeau
  38.  * Minor changes, casting xv_get() calls to (char*) to avoid compiler
  39.  * warning messages.
  40.  * 
  41.  * Revision 2.13  92/05/14  15:40:06  drapeau
  42.  * * Updated copyright information in the source.
  43.  * * Removed obsolete code that was already commented out.
  44.  * 
  45.  * Revision 2.12  92/01/11  01:42:03  drapeau
  46.  * Removed redeclarations of string functions since OpenWindows 2.0
  47.  * headers don't seem to like them (OpenWindows 3.0 seemed to need
  48.  * them).
  49.  * 
  50.  * Revision 2.11  92/01/09  18:25:10  drapeau
  51.  * Slight modifications to make code ANSI-compliant.
  52.  * 
  53.  * Revision 2.1  91/12/31  18:38:48  drapeau
  54.  * Removed inclusion of string.h, since XView should include the
  55.  * appropriate definitions.
  56.  * 
  57.  * Revision 2.0  91/09/30  15:01:43  derek
  58.  * Version number changed to 2.0.
  59.  * 
  60.  * Revision 1.59  91/09/18  20:53:31  derek
  61.  * The Makefile is changed due to the changes made in the collab/ directory.
  62.  * 
  63.  * Revision 1.58  91/09/15  20:04:54  derek
  64.  * The following things are done:
  65.  * 1.      The foreground of mainTextPane and Quote Window are set to be black.
  66.  *         Also, the color of all the text fields are set to black.
  67.  * 2.      Now the quoted text will be shown directly on the Quote Window
  68.  *         when a panel-item selection is made.  The text will also be shown
  69.  *         while the author is highlighting a selection in the text window.
  70.  * 3.      The inconsistency problem regarding text selection is being taken
  71.  *         care of.  When the mouse cursor re-enters the text window,
  72.  *         the selection will be highlighted again.
  73.  * 4.      When the play button is pressed, the text currently selected
  74.  *         in the text window (rather than the text initially associated
  75.  *         with the edit) will be displayed.
  76.  * 5.      The name of the menu_option "Show Quote Window Specifications panel"
  77.  *         is shortened to be "Quote Window Options ..."
  78.  * 6.      A notify_interpose_destroy_func() is being added to fix the bug
  79.  *         that QuoteMaker might exit without killing the Quote Window (which
  80.  *         is also a base window).
  81.  * 7.      When a different font family or font style is selected, the change
  82.  *         will be automatically be reflected on the Quote Window (without the
  83.  *         need to "play" the edit in order to verify the font).  For font
  84.  *         size, the change will be reflected when either a return character is
  85.  *         entered at the text field or when one of those numeric "arrows"
  86.  *         are pressed.
  87.  * 8.      The play button will now flash when an edit is being played.
  88.  *         Pause button will also glow when playing is paused.
  89.  * 9.      In the course of playing, when another edit is selected,
  90.  *         the playing will be stopped.
  91.  * 10.     I have used Saber to clean up the code.
  92.  * 11.     The left-over "NewEditListPopUp" window is removed.
  93.  * 12.     The bug that when quote window is iconified, it wont be un-iconified
  94.  *         when the edit is played in timeline, is fixed.
  95.  * 13.     The DurationEstimate function is changed so that it no longer
  96.  *         needs an edit to be selected first.  It will take textWindowStart
  97.  *         and textWindowEnd directly as input parameters.
  98.  * 
  99.  * 
  100.  * 
  101.  * Revision 1.57  91/09/05  15:47:18  derek
  102.  * The following changes are made:
  103.  * 1.      The name "Quoted Text Window" has been changed to "Quote Window"
  104.  *         in the app.
  105.  * 2.      ShowApplication() and HideApplication() is changed because of the
  106.  *         the change of quote window from a popup to a basewindow.
  107.  * 3.      The QuitProc of QuoteMaker is fixed so that the quote window,
  108.  *         as a base window, will be destroyed separately.
  109.  * 4.      Now hitting return in the label field will not result in adding
  110.  *         a new edit.
  111.  * 5.      Copyright messages are included in front of every .h and .c file.
  112.  * 6.      The scrollbar and the footer of the Quote Window are hidden.
  113.  * 7.      I have changed the include openpanel.h statement in QuoteMaker.c
  114.  *         to include Browse.h.
  115.  * 8.      The delete bug corresponding to the change that the panel-list
  116.  *         must have a choice -- is fixed.  Also, the corresponding bug
  117.  *         for deleteAll is also fixed.
  118.  * 9.      Now, deleteAll and deletion of the last item in Panel_list
  119.  *         will cause the panel-list to be destroyed and a new one will
  120.  *         be created.
  121.  * 10.     GetOpt files have been removed from the directory.  Corresponding
  122.  *         changes are made.
  123.  * 11.     The start and end byte fields are removed from the main panel.
  124.  * 12.     I have put iconify, hide and show quote window to be buttons
  125.  *         instead of menu options.
  126.  * 13.     I have removed the PreviewPanelPopup and incorporated its features into
  127.  *         the main panel.  The three buttons:  pause, play and stop and
  128.  *         the DurationGauge are moved to the main panel.  But the
  129.  *         StatusMessage is removed.
  130.  * 14.     The EnableLocationChange and EnableSizeChange choice setting
  131.  *         are removed.  There are no longer such choices.
  132.  * 15.     Right now if a panel-item is selected and if another panel-item
  133.  *         is picked, the DeselectList() operation in the middle is
  134.  *         eliminated.  This operation involves updating of text fields and
  135.  *         messages and its removal speeds up the program.  The panel-list
  136.  *         must now take at least one choice.  (A choice must be selected
  137.  *         whenever there is at least one item on the list).  And now
  138.  *         there is no way to deselect a list by the user.
  139.  * 16.     The "modified bit" associated with the CurrentSelectionNumberLabel
  140.  *         is implemented.  Now, if a selection is picked, and if either
  141.  *         the quote window is moved or any text fields are changed, the
  142.  *         modified bit will be on.
  143.  * 17.     The Show-text-window button and the Show-quote-window-specifications-popup
  144.  *         button are removed.  They are now menu options under the Options Menu.
  145.  * 18.     The Modify button has its name changed to "Update Edit".
  146.  * 
  147.  * Revision 1.56  91/08/29  11:56:34  derek
  148.  * x-y-coordinates-reversed-bug in SetQuotedTextWindowLocation() is fixed.
  149.  * 
  150.  * Revision 1.55  91/08/28  14:03:38  derek
  151.  * The following things are done:
  152.  * 1.    I have changed the NewEditList option to call the file browser
  153.  *     instead of giving a popup window.
  154.  * 2.    I ahve renamed all the options in the file menu so that they
  155.  *     are clearer and more informative.
  156.  * 3.    The documentFileType has been changed from "DTR" (which was
  157.  *     a copying fault :)) to "QuoteMaker".
  158.  * 4.    I ahve changed the stop button so that if it sees that 
  159.  *     HideQTWAfterPlayingEdit is true, stopplay will hide the window too.
  160.  * 5.    I have changed QuoteMaker.G (the interface) so that there is no
  161.  *     way to deselect a fontfamily and fontstyle item from the panel list
  162.  *     (ie. a choice is required.)
  163.  * 
  164.  * Revision 1.54  91/08/27  14:50:26  derek
  165.  * I have added a notice prompt which gives a warning when NewSender
  166.  * returns a NULL (meaning that the PortManager is absent).
  167.  * 
  168.  * Revision 1.53  91/08/27  14:34:51  derek
  169.  * The following things are done:
  170.  * 1.    The QuotedTextWindow is changed from a base window to a popup window
  171.  *     (now it's called QuotedMaker_quotedTextBaseWindow).  I have also
  172.  *     added a few options: show, hide and iconify QTW and also created
  173.  *     an icon for QTW.
  174.  * 2.    The quoted text will be set in PerformSelection() instead of 
  175.  *     in SetSelection().
  176.  * 3.    I have changed the Document field and the EditList field of 
  177.  *     QuoteMaker so that they will display fill paths.
  178.  * 
  179.  * Revision 1.52  91/08/26  11:58:13  derek
  180.  * The following things are done:
  181.  * 1.    I have added a few notice_prompts to the linkProtocol (network)
  182.  *     functions to give warnings about invalid document names.
  183.  * 2.    The quoted text window will by default be hidden during "blank"
  184.  *     times. ie. when it is not displaying any text.  The interface has
  185.  *     been changed so that it now has a HideQuotedTExtWindowAfterPreview
  186.  *     check box.  The QuotedTextWindow will either stay on the screen
  187.  *     or be hidden as the author desires.
  188.  * 3.    Make the changes corresponding to the changing of name from OpenPanel
  189.  *     to Browse.
  190.  * 4.    The return value bug for OpenHandler, SaveHandler is fixed.
  191.  * 5.    I have changed the code so that Save and SaveAs will behave correctly.
  192.  *     The SaveAs PopUp/Open PopUp are removed.  Browse check is 
  193.  *     incorporated in the applications.
  194.  * 6.    The QuoteMaker file format has been changed.  An EditNumber field    
  195.  *     has been added.
  196.  * 7.    Changes corresponding to the return value by OpenDoc and SetSelection
  197.  *     are made.
  198.  * 8.    GetAppIcon() has been implemented.
  199.  * 9.    Fonts specified in the Edit-list will be preloaded in OpenDoc().
  200.  *     This will hopefully eliminate the startup delay needed to load
  201.  *     the font when we put text onto the Quoted TExt Window for the 
  202.  *     first time.
  203.  * 10.    The "play" button will now play things specified in the 
  204.  *     QuotedTExtWindowSpecificationsPopUp (instead of those specified
  205.  *     in the editList).
  206.  * 11.    The show selection button is replaced by the set selection button.
  207.  *     The Set Selection button willl now not only set the current
  208.  *     edit parameters but will also highlight the corresponding section
  209.  *     in the text.  Also, when one item on the panel-list is clicked on,
  210.  *     the corresponding segment in the text will also be highlighted.
  211.  * 12.    Notify events which tells the app to show the size and location 
  212.  *     of the Quoted Text Window are set up.  ie. those text-fields
  213.  *     on the interface will be updated instantaneously.
  214.  * 16.    editList.label is being sent across the network.
  215.  * 17.    The title bar and the footer of the QuotedTExtWindow are hidden.
  216.  * 
  217.  * Revision 1.51  91/08/13  22:52:11  derek
  218.  * I have incorporated the openpanel/savepanel stuff.
  219.  * 
  220.  * Revision 1.50  91/08/09  18:17:44  derek
  221.  * I removed all the free() statements from the code to
  222.  * fix the bug and improve run-time efficiency.
  223.  * 
  224.  * Revision 1.49  91/08/08  21:47:06  derek
  225.  * I fixed an edit list bug.
  226.  * 
  227.  * Revision 1.48  91/07/29  10:37:10  derek
  228.  * Now the textWindowPopup would not show when the application first comes up.
  229.  * 
  230.  * Revision 1.47  91/07/22  16:46:11  derek
  231.  * I have added 4 buttons to get and set the current
  232.  * location and size of the quoted text window.
  233.  * 
  234.  * Revision 1.46  91/07/15  12:18:17  derek
  235.  * 1.      I have added font selection panel to the application.
  236.  *         Now a user can specify a font by choosing a font family, a font
  237.  *         style and font size.
  238.  * 2.      Location and size fields are added to the application.  User
  239.  *         can specify the size and location of the QuotedTextWindow.
  240.  * 3.      A duration estimate button is added to estimate how long the
  241.  *         the quoted text should last.
  242.  * 4.      Interface has been redesigned to accomodate the addition of
  243.  *         font, size and location functionalities.
  244.  * 6.      EditList file format has been changed to accomodate the new
  245.  *         fields.  They are:  location (x,y), width, height, font family,
  246.  *         font style, font width for QuotedTextWindow.
  247.  * 5.      Two timers have been added in an attempt to ensure accuracy
  248.  *         of gauge-updating in the preview panel.
  249.  * 6.      Command line args are now supported.
  250.  * 7.      I have cleaned up the code by using saber.
  251.  * 8.      Several bugs from previous revision are fixed.
  252.  * 
  253.  * 
  254.  * Revision 1.45  91/07/02  15:07:25  derek
  255.  * QuoteMaker now fully speaks the new MAEstro protocol.
  256.  * 
  257.  * Revision 1.44  91/07/01  18:42:56  derek
  258.  * The following things are done:
  259.  * 1.    The interface is redesigned.  Duration fields are added to each 
  260.  *     edit list.
  261.  * 2.    The function panel (functions Window) is implemented.  The 
  262.  *     application is now capable of being "played", "stopped" and
  263.  *     "paused".  The sense of "time" is now complete.
  264.  * 3.    Makefile fixed.  
  265.  * 4.    Declaration errors left by previous author are cleaned up.
  266.  * 5.    Redundant malloc statements removed.   Certain other
  267.  *     functions are changed to improve code efficiency.
  268.  * 6.    Code cleaned up by saber.  Removed redundant
  269.  *     variables.
  270.  * 
  271.  * Revision 1.43  91/06/28  13:15:13  derek
  272.  * Blank functions added to the code to make the application "compatible"
  273.  * with the new protocol.
  274.  * 
  275.  * Revision 1.42  91/06/27  18:20:51  derek
  276.  * I have cleaned up some of the comments.  No change in code.
  277.  * 
  278.  * Revision 1.41  91/06/19  17:47:37  drapeau
  279.  * No changes; changing RCS revision numbers.
  280.  * 
  281.  * Revision 1.4  91/05/06  01:48:30  drapeau
  282.  * Added code to set position of top level frame, so that XV_X and XV_Y
  283.  * attributes need not be set in the _ui.c file.  The new functionality is done
  284.  * via the "frame_set_rect()" XView function.
  285.  * 
  286.  * Revision 1.3  91/01/06  20:14:44  drapeau
  287.  * Made several modifications relating to selection of text and items from the
  288.  * edit list.  Current selection information is no longer erased when an edit
  289.  * is added to the list.  Currently selected text is no longer de-selected when
  290.  * anything is done to an edit (add, modify, select, delete).  Message showing
  291.  * current edit number now correctly updates.  Message showing number of edits
  292.  * in the current document now correctly updates.  Modify feature now works
  293.  * correctly.  Modify and Delete buttons now dim and "undim" at the appropriate
  294.  * times.
  295.  * 
  296.  * Revision 1.2  91/01/05  00:46:42  drapeau
  297.  * Modified QuitProc() so that a dialog appears only if there are unsaved
  298.  * changes to be made or discarded.  If there are no outstanding changes to be
  299.  * made, application exit is immediate.
  300.  * 
  301.  * Revision 1.1  90/12/04  17:21:26  drapeau
  302.  * Initial revision
  303.  *  */
  304.  
  305. static char rcsid[] = "$Header: /Source/Media/collab/QuoteMaker/RCS/QuoteMaker.c,v 2.16 92/09/25 13:55:32 drapeau Exp $";
  306.  
  307.  
  308. /*
  309.  * QuoteMaker.c - Notify and event callback function stubs.
  310.  * This file was copied from "QuoteMaker_stubs.c", which was
  311.  * generated by `gxv' from `QuoteMaker.G'.
  312.  * Modified by George Drapeau on October 26, 1990.
  313.  */
  314.  
  315. #include <stdio.h>
  316. #include <sys/param.h>
  317. #include <sys/types.h>
  318. #include <xview/xview.h>
  319. #include <xview/panel.h>
  320. #include <xview/textsw.h>
  321. #include <xview/xv_xrect.h>
  322. #include <gdd.h>
  323. #include "QuoteMaker_ui.h"
  324. #include <sys/stat.h>
  325. #include <xview/font.h>
  326. #include <xview/notice.h>
  327. #include <xview/notify.h>
  328. #include <xview/server.h>          
  329. #include <xview/seln.h>            
  330. #include <math.h>
  331. #include "Sender.h"
  332. #include "Receiver.h"
  333. #include <getopt.h>
  334. #include "quoteMakerDefs.h"
  335. #include <Browse.h>
  336. #include <string.h>
  337.  
  338. QuoteMaker_baseWindow_objects        *QuoteMaker_baseWindow;
  339. QuoteMaker_quotedTextBaseWindow_objects *QuoteMaker_quotedTextBaseWindow;
  340. QuoteMaker_infoPopup_objects        *QuoteMaker_infoPopup;
  341. QuoteMaker_textWindowPopup_objects    *QuoteMaker_textWindowPopup;
  342. QuoteMaker_QuoteWindowSpecificationsPopup_objects    *QuoteMaker_QuoteWindowSpecificationsPopup;
  343.  
  344.  
  345. Sender*        sender;                            /* Variables for the Link Protocol. */
  346. Receiver*    receiver;
  347. Port        senderPort;
  348. int             ReceiverPortNumber;
  349.  
  350. int        mostRecentEditNum;
  351. EditList    editList;                        /* Currently this app. supports only 1 open... */
  352.                                                                     /* ...document; thus, only one editList is needed. */
  353. char            *startFilename;
  354.  
  355. /* Variables describing documents and edit lists. */
  356. char    absoluteDocumentName[MAXPATHLEN + 1];
  357. char    absoluteEditListName[MAXPATHLEN + 1];
  358. int    unsavedChangesExist;
  359. int    untitledEditListNum;                        /* So we can say untitled0  */
  360.  
  361. Xv_Server server;
  362.  
  363.  
  364. #ifdef MAIN
  365.  
  366. /*
  367.  * Instance XV_KEY_DATA key.  An instance is a set of related
  368.  * user interface objects.  A pointer to an object's instance
  369.  * is stored under this key in every object.  This must be a
  370.  * global variable.
  371.  */
  372. Attr_attribute    INSTANCE;
  373.  
  374. void main(argc, argv)
  375.      int        argc;
  376.      char        **argv;
  377. {
  378.   int    counter;
  379.   Rect    tempRect;
  380.   
  381.   static DispatchTable  DT = 
  382.   {
  383.     OpenDoc,
  384.     GetDoc,
  385.     GetSelection,
  386.     SetSelection,
  387.     PerformSelection,
  388.     NULL,
  389.     NULL,
  390.     NULL,
  391.     NULL,
  392.     NULL,
  393.     NULL,
  394.     HaltSelection,
  395.     PauseSelection,
  396.     ResumeSelection,
  397.     HideApplication,
  398.     ShowApplication,
  399.     GetAppIcon
  400.     };
  401.   
  402.   xv_init(XV_INIT_ARGC_PTR_ARGV, &argc, argv, 0);            /* Initialize XView. */
  403.   INSTANCE = xv_unique_key();                        /* Initialize user interface components. */
  404.   
  405.   QuoteMaker_baseWindow = QuoteMaker_baseWindow_objects_initialize(NULL, NULL);
  406.   QuoteMaker_infoPopup = QuoteMaker_infoPopup_objects_initialize(NULL, QuoteMaker_baseWindow->baseWindow);
  407.   QuoteMaker_textWindowPopup = QuoteMaker_textWindowPopup_objects_initialize(NULL, QuoteMaker_baseWindow->baseWindow);
  408.   QuoteMaker_QuoteWindowSpecificationsPopup =
  409.     QuoteMaker_QuoteWindowSpecificationsPopup_objects_initialize(NULL, QuoteMaker_baseWindow->baseWindow);
  410.   QuoteMaker_quotedTextBaseWindow = QuoteMaker_quotedTextBaseWindow_objects_initialize(NULL, NULL);
  411.  
  412.   frame_get_rect(QuoteMaker_baseWindow->baseWindow,&tempRect);        /* Get the size of the top-level window */
  413.   tempRect.r_top = 110;
  414.   tempRect.r_left = 615;
  415.   frame_set_rect(QuoteMaker_baseWindow->baseWindow,&tempRect);        /* Set the position of the top-level window */
  416.   
  417.   frame_get_rect(QuoteMaker_quotedTextBaseWindow->quotedTextBaseWindow,
  418.          &tempRect);
  419.   tempRect.r_top = 100;
  420.   tempRect.r_left = 100;
  421.   frame_set_rect(QuoteMaker_quotedTextBaseWindow->quotedTextBaseWindow,
  422.          &tempRect);                        /* Set the position of the top-level window */
  423.  
  424.   OldLocX = tempRect.r_left;
  425.   OldLocY = tempRect.r_top;
  426.   OldSizeWidth = tempRect.r_width;                    /* Initialize the old width and old height for the */
  427.   OldSizeHeight = tempRect.r_height;                    /* ...sake of the modified bit.                    */
  428.   
  429.   server = (Xv_Server) xv_get (xv_get (QuoteMaker_baseWindow->baseWindow, XV_SCREEN), SCREEN_SERVER);
  430.   
  431.   listFont = (Xv_font *) xv_find(QuoteMaker_baseWindow->baseWindow, FONT,
  432.                  FONT_FAMILY, FONT_FAMILY_LUCIDA_FIXEDWIDTH,
  433.                  FONT_STYLE, FONT_STYLE_NORMAL,
  434.                  FONT_SIZE, 12,
  435.                  NULL);
  436.   displayFont = (Xv_font *) xv_find(QuoteMaker_baseWindow->baseWindow, FONT,
  437.                     FONT_FAMILY, FONT_FAMILY_ROMAN,
  438.                     FONT_STYLE, FONT_STYLE_BOLD,
  439.                     FONT_SIZE, 24,
  440.                     NULL);
  441.   annotateFont = (Xv_font *) xv_find(QuoteMaker_baseWindow->baseWindow, FONT,
  442.                      FONT_NAME, "-*-helvetica-medium-r-normal-*-*-120-*-*-*-*-*-*",
  443.                      NULL);
  444.   
  445.   xv_set (QuoteMaker_textWindowPopup->mainTextPane,
  446.       TEXTSW_MEMORY_MAXIMUM, MAX_TEXTSW_LEN,
  447.       TEXTSW_BROWSING, TRUE,        
  448.       TEXTSW_AGAIN_RECORDING, FALSE,
  449.       TEXTSW_LINE_BREAK_ACTION, TEXTSW_WRAP_AT_WORD,
  450.       WIN_CONSUME_EVENTS,
  451.       WIN_NO_EVENTS, LOC_WINENTER, NULL,
  452.       XV_FONT, annotateFont,
  453.       NULL);
  454.   
  455.   xv_set (QuoteMaker_quotedTextBaseWindow->quotedTextPane,
  456.       TEXTSW_MEMORY_MAXIMUM, MAX_TEXTSW_LEN,
  457.       TEXTSW_BROWSING, TRUE,        
  458.       TEXTSW_AGAIN_RECORDING, FALSE,
  459.       TEXTSW_LINE_BREAK_ACTION, TEXTSW_WRAP_AT_WORD,
  460.       XV_FONT, displayFont,
  461.       NULL);
  462.   
  463.   mostRecentEditNum = NO_CURRENT_EDIT;
  464.   unsavedChangesExist = NO;
  465.   untitledEditListNum = 1;
  466.   editList.numItems = 0;
  467.   for (counter = 0; counter < MAXLISTSIZE; counter++)            /* Initialize the editList's labels to NULL strings */
  468.     editList.label[counter] = (char*)NULL;
  469.   SetEditList("NoneSpecified");
  470.   
  471.   senderPort.hostName = "localhost";                    /* Network code start up... setting up ports etc.   */
  472.   senderPort.portNumber = AnyPort;
  473.  
  474.   startFilename = NULL;
  475.   CheckOptions(argc, argv);
  476.  
  477.   senderPort.portNumber = PortMgrPortNumber;
  478.   sender = NewSender(&senderPort);
  479.  
  480.   if (sender == NULL)
  481.   {
  482.     AlertByNoticePrompt(QuoteMaker_baseWindow->baseWindow,
  483.             "Error:  PortManager seems to be absent.  Please start PortManager again.");
  484.     exit(0);
  485.   }
  486.     
  487.   receiver = NewReceiver(sender, "QuoteMaker", ReceiverPortNumber);
  488.  
  489.   BuildDispatchTable (&DT);
  490.   
  491.   (void) notify_enable_rpc_svc (TRUE);                    /* Tell the toolkit to listen for network messages */
  492.   
  493.   InitTimer();                                /* Initialize the timer. */
  494.   
  495.   InitMainPanel();
  496.   
  497.   InitFontPanel();                            /* Initialize the font scrolled lists. */
  498.  
  499.   InitQuotedTextWindow();
  500.  
  501.   ClearQuoteWindowSpecificationsPopup();
  502.  
  503.   InitBrowse();
  504.  
  505.   InitTextFields();                            /* Change the notify levels of the text fields to  */
  506.                                     /* ...be PANEL_ALL.  This is for the sake of the.. */
  507.                                     /* ...EditModified Bit.                            */
  508.   if (startFilename != NULL)                        
  509.     ReadEditListFromFile(startFilename, USER);                
  510.  
  511.   xv_main_loop(QuoteMaker_baseWindow->baseWindow);            /* Turn control over to XView. */
  512.   exit(0);
  513. }
  514.  
  515. #endif
  516.  
  517.  
  518. void CheckOptions(argc, argv)
  519.      int     argc;
  520.      char     **argv;
  521. {
  522.   int optionChar;  
  523.   int option_index = 0;
  524.   static struct option long_options[] =
  525.   {
  526.     {"hostname", 1, 0, 'h'},        
  527.  
  528.     {"portnumber", 1, 0, 'p'},
  529.     {0, 0, 0, 0}
  530.   };
  531.  
  532.   while (1)                                /* Start parsing all known options */
  533.   {
  534.     optionChar = getopt_long_only (argc, argv, "h:p:",
  535.                   long_options, &option_index);
  536.     if (optionChar == EOF)                        /* Done with all known options */
  537.     {
  538.       break;
  539.     }
  540.     switch (optionChar)
  541.     {
  542.      case 'h':
  543.       if (optarg) 
  544.       {
  545.     strcpy (senderPort.hostName, optarg);
  546.       }
  547.       break;
  548.      case 'p':
  549.       if (optarg) 
  550.       {
  551.     ReceiverPortNumber = atoi(optarg);
  552.       }
  553.       break;
  554.      default:
  555.       break;
  556.     }
  557.   }
  558.   if (optind < argc)                            /* Check if a filename has been specified */
  559.   {
  560.     startFilename = (char *) malloc (256);
  561.     strcpy (startFilename, argv[optind]);
  562.   }
  563. }
  564.  
  565.  
  566.  
  567. Menu_item Info(item, op)                        /* Menu handler for `fileMenu (Info...)'. */
  568.      Menu_item    item;
  569.      Menu_generate    op;
  570. {
  571.   switch (op)
  572.   {
  573.    case MENU_DISPLAY:
  574.     break;
  575.     
  576.    case MENU_DISPLAY_DONE:
  577.     break;
  578.     
  579.    case MENU_NOTIFY:
  580.     Show(&QuoteMaker_infoPopup->infoPopup);
  581.     break;
  582.     
  583.    case MENU_NOTIFY_DONE:
  584.     break;
  585.   }
  586.   return item;
  587. }                                    /* end function Info */
  588.  
  589.  
  590.  
  591.  
  592. Menu_item Quit(item, op)                        /* Menu handler for `fileMenu (Quit)'. */
  593.      Menu_item    item;
  594.      Menu_generate    op;
  595. {
  596.   switch (op)
  597.   {
  598.    case MENU_DISPLAY:
  599.     break;
  600.     
  601.    case MENU_DISPLAY_DONE:
  602.     break;
  603.     
  604.    case MENU_NOTIFY:
  605.     QuitProc();
  606.     break;
  607.     
  608.    case MENU_NOTIFY_DONE:
  609.     break;
  610.   }
  611.   return item;
  612. }                                    /* end function Quit */
  613.  
  614.  
  615. /*
  616.  * Menu handler for `OptionsMenu (                  Show Text Window)'.
  617.  */
  618. Menu_item
  619. ShowTextWindowHandler(item, op)
  620.     Menu_item    item;
  621.     Menu_generate    op;
  622. {
  623.   switch (op) {
  624.    case MENU_DISPLAY:
  625.     break;
  626.  
  627.    case MENU_DISPLAY_DONE:
  628.     break;
  629.  
  630.    case MENU_NOTIFY:
  631.     Show(&QuoteMaker_textWindowPopup->textWindowPopup);
  632.     break;
  633.  
  634.    case MENU_NOTIFY_DONE:
  635.     break;
  636.   }
  637.   return item;
  638. }
  639.  
  640. /*
  641.  * Menu handler for `OptionsMenu (Show Quote Window Specifications Panel)'.
  642.  */
  643. Menu_item
  644. ShowQuoteWindowSpecificationsPanelHandler(item, op)
  645.     Menu_item    item;
  646.     Menu_generate    op;
  647. {
  648.   switch (op) {
  649.    case MENU_DISPLAY:
  650.     break;
  651.  
  652.    case MENU_DISPLAY_DONE:
  653.     break;
  654.  
  655.    case MENU_NOTIFY:
  656.     Show(&QuoteMaker_QuoteWindowSpecificationsPopup->QuoteWindowSpecificationsPopup);
  657.     break;
  658.  
  659.    case MENU_NOTIFY_DONE:
  660.     break;
  661.   }
  662.   return item;
  663. }
  664.  
  665.  
  666. QuitProc()
  667. {
  668.   if (unsavedChangesExist == YES)
  669.     GiveOneLastChanceToSave();
  670.   unsavedChangesExist = NO;                        /* This is to tell the DestroyBaseWindow notifier...*/
  671.                                     /* ...that it should quit assuming that there are...*/
  672.                                     /* ...no more changes.                              */
  673.   SenderDisconnectFromPortMgr(sender,&(receiver->receivePort));        /* Tell the Port Manager "I'm outtahere" */
  674.   xv_destroy_safe(QuoteMaker_quotedTextBaseWindow->quotedTextBaseWindow);
  675.   xv_destroy_safe(QuoteMaker_baseWindow->baseWindow);
  676. }                                    /* end function QuitProc */
  677.  
  678.  
  679.  
  680. int DumpEntry(item, string, client_data, op, event)            /* Notify callback func. for `editListScrolledList'. */
  681.      Panel_item        item;
  682.      char*        string;
  683.      Xv_opaque        client_data;
  684.      Panel_list_op    op;
  685.      Event*        event;
  686. {
  687.   int  selected;
  688.  
  689.   switch(op)
  690.   {
  691.    case PANEL_LIST_OP_DESELECT:
  692.     break;
  693.     
  694.    case PANEL_LIST_OP_SELECT:
  695.     if (Playing)
  696.     {
  697.       StopButtonHandler(NULL, NULL);
  698.     }
  699.     
  700.     selected = Selected();
  701.     SetCurrentSelection(selected);
  702.     ClearQuotedTextWindow();
  703.     DisplayTextOnQuoteWindow();
  704.     ClearEditModified();
  705.     break;
  706.     
  707.    case PANEL_LIST_OP_VALIDATE:
  708.    case PANEL_LIST_OP_DELETE:
  709.     break;
  710.   }
  711.   return XV_OK;
  712. }                                    /* end function DumpEntry */
  713.  
  714.  
  715. void LoadSelection()
  716. {
  717.   GetSelectionEndpoints (&textWindowStart, &textWindowEnd);
  718. }                                    /* end function LoadSelection */
  719.  
  720.  
  721. void ShowSelection(item, event)                        /* Notify callback func. for `showSelectionButton'. */
  722.      Panel_item    item;
  723.      Event        *event;
  724. {
  725.   int   select;
  726.   
  727.   select = Selected();
  728.  
  729.   if (Playing)
  730.   {
  731.     StopButtonHandler(NULL, NULL);
  732.   }
  733.  
  734.   if (select == NO_CURRENT_EDIT)
  735.   {
  736.     AlertByNoticePrompt(QuoteMaker_baseWindow->baseWindow,
  737.             "You must select an edit first.");
  738.   }
  739.   else
  740.   {
  741.     ClearQuotedTextWindow();
  742.     SetCurrentSelection(select);
  743.     SetCurrentSelection(select);                    /* This function is called twice in order to fix... */
  744.                                     /* ...the weird bug concerning the "modify bit"...  */
  745.                                     /* ...of the QuotedTextWindowInterposer.            */
  746.                                     /* ...This extra statement can surely removed if... */
  747.                                     /* ...the "modify bit" for the edit is no longer... */
  748.                                     /* ...implemented.                                  */
  749.     DisplayTextOnQuoteWindow();
  750.     ClearEditModified();
  751.   }
  752. }                                    /* end function ShowSelection */
  753.  
  754.  
  755. void
  756.   ShowTextWindowSelection()
  757. {
  758.   Show(&QuoteMaker_textWindowPopup->textWindowPopup);
  759. /**************
  760.   start = (int) xv_get(QuoteMaker_baseWindow->selectionStartField,
  761.                PANEL_VALUE);
  762.   end = (int) xv_get(QuoteMaker_baseWindow->selectionEndField,
  763.              PANEL_VALUE);
  764.   HighlightSelection(start, end);
  765. ****************/
  766. }
  767.  
  768.  
  769.  
  770. void ButtonShowText(item, event)                    /* Notify callback function for `showTextButton'. */
  771.      Panel_item    item;
  772.      Event        *event;
  773. {
  774.   Show(&QuoteMaker_textWindowPopup->textWindowPopup);
  775. }
  776.  
  777.  
  778.  
  779. /*
  780.  * Notify callback function for `EstimateDurationButton'.
  781.  * The formula for estimating duration given the number of bytes
  782.  * of the current edit is as follows:
  783.  *     duration = latency + 0.1 * (number of characters)
  784.  */
  785. void
  786. EstimateDurationNotifyHandler(item, event)
  787.     Panel_item    item;
  788.     Event        *event;
  789. {
  790.   int    selected;
  791.   double estimatedDuration;
  792.   int    mins;
  793.   double secs;
  794.  
  795.   estimatedDuration = 1.5 + 0.1 * (textWindowEnd - textWindowStart);
  796.   mins = (int)(floor(estimatedDuration / 60.0));
  797.   secs = estimatedDuration - mins * 60.0;
  798.   sprintf(msg, "%d", mins);
  799.   xv_set (QuoteMaker_baseWindow->DurationMinsTextField, PANEL_VALUE, msg, NULL);
  800.   sprintf(msg, "%.1lf", secs);
  801.   xv_set (QuoteMaker_baseWindow->DurationSecsTextField, PANEL_VALUE, msg, NULL);
  802. }
  803.  
  804.  
  805. /*
  806.  * Notify callback function for `HideQuoteWindowButton'.
  807.  */
  808. void
  809. HideQuoteWindowButtonHandler(item, event)
  810.     Panel_item    item;
  811.     Event        *event;
  812. {
  813.   xv_set(QuoteMaker_quotedTextBaseWindow->quotedTextBaseWindow,
  814.      XV_SHOW, FALSE,
  815.      NULL);
  816.   
  817.   xv_set(QuoteMaker_QuoteWindowSpecificationsPopup->SizeMessage,
  818.      PANEL_LABEL_STRING, "", NULL);
  819.   xv_set(QuoteMaker_QuoteWindowSpecificationsPopup->LocationMessage,
  820.      PANEL_LABEL_STRING, "", NULL);
  821.   textsw_set_selection(QuoteMaker_textWindowPopup->mainTextPane,    /*  Highlight the selection (because the text_sw... */
  822.                textWindowStart, textWindowEnd + 1,        /*  ...will keep forgetting about it.               */
  823.                PRIMARY_SELECTION);
  824. }
  825.  
  826.  
  827. /*
  828.  * Notify callback function for `IconifyQuoteWindowButton'.
  829.  */
  830. void
  831. IconifyQuoteWindowButtonHandler(item, event)
  832.     Panel_item    item;
  833.     Event        *event;
  834. {
  835.   xv_set(QuoteMaker_quotedTextBaseWindow->quotedTextBaseWindow,
  836.      XV_SHOW, TRUE,
  837.      FRAME_CLOSED, TRUE,
  838.      NULL);
  839.   textsw_set_selection(QuoteMaker_textWindowPopup->mainTextPane,    /*  Highlight the selection (because the text_sw... */
  840.                textWindowStart, textWindowEnd + 1,        /*  ...will keep forgetting about it.               */
  841.                PRIMARY_SELECTION);
  842. }
  843.  
  844.  
  845. Panel_setting TextFieldAddSelection(item, event)            /* Notify callback func. for `selectionLabelField'. */
  846.      Panel_item    item;
  847.      Event        *event;
  848. {
  849.   CheckIfEditModified(TRUE);
  850.   
  851.   return panel_text_notify(item, event);
  852. }                                    /* end function TextFieldAddSelection */
  853.  
  854.  
  855.  
  856. /*
  857.  * Notify callback function for `ShowQuoteWindowButton'.
  858.  */
  859. void ShowQuoteWindowButtonHandler(Panel_item    item,
  860.                    Event*        event)
  861. {
  862.   static Rect    tempRect;
  863.   int           selected;
  864.   
  865.   if (xv_get(QuoteMaker_quotedTextBaseWindow->quotedTextBaseWindow,
  866.          XV_SHOW) == FALSE ||
  867.       xv_get(QuoteMaker_quotedTextBaseWindow->quotedTextBaseWindow,
  868.          FRAME_CLOSED) == TRUE)
  869.   {
  870.     xv_set(QuoteMaker_quotedTextBaseWindow->quotedTextBaseWindow,
  871.        FRAME_CLOSED, FALSE,
  872.        XV_SHOW, TRUE,
  873.        NULL);
  874.     
  875.     selected = Selected();
  876.     if (selected != NO_CURRENT_EDIT)
  877.     {
  878.       frame_get_rect(QuoteMaker_quotedTextBaseWindow->quotedTextBaseWindow,
  879.              &tempRect);        
  880.       tempRect.r_left = editList.locX[selected] + FRAME_X_OFFSET;
  881.       tempRect.r_top  = editList.locY[selected] + FRAME_Y_OFFSET;
  882.       
  883.       frame_set_rect(QuoteMaker_quotedTextBaseWindow->quotedTextBaseWindow,
  884.              &tempRect);
  885.     }
  886.   }
  887.   else
  888.   {
  889.     xv_set(QuoteMaker_quotedTextBaseWindow->quotedTextBaseWindow,
  890.        FRAME_CLOSED, FALSE,
  891.        XV_SHOW, TRUE,
  892.        NULL);
  893.   }
  894.   textsw_set_selection(QuoteMaker_textWindowPopup->mainTextPane,    /*  Highlight the selection (because the text_sw... */
  895.                textWindowStart, textWindowEnd + 1,        /*  ...will keep forgetting about it.               */
  896.                PRIMARY_SELECTION);
  897. }                                    /* end function ShowQuoteWindowButtonHandler */
  898.  
  899.  
  900. void AddSelection(item, event)                        /* Notify callback function for `addButton'. */
  901.      Panel_item    item;
  902.      Event        *event;
  903. {
  904.   /* Note that text selection is unhighlighted, then selected row is deselected,
  905.      then operation is performed on panel list.  This seems to be about the best
  906.      way to avoid getting segmentation faults when selecting a panel list row:
  907.      
  908.      A. Deselect selected text before working with panel list
  909.      B. Deselect selected row before adding/deleting/modifying list.
  910.      */
  911.   
  912.   QuoteMaker_baseWindow_objects    *ip =                    /* In this case, ip points to the control panel... */
  913.     (QuoteMaker_baseWindow_objects *) xv_get(item,            /* ...that contans the 'addButton' */
  914.                          XV_KEY_DATA,
  915.                          INSTANCE);
  916.   char       label[MAX_LABEL_LEN + 1];
  917.   int       start;
  918.   int       end;
  919.   double   duration;
  920.   int      locX;
  921.   int      locY;
  922.   int      sizeWidth;
  923.   int      sizeHeight;
  924.   int      mins;
  925.   double   secs;
  926.   int      fontFamily;
  927.   int      fontStyle;
  928.   int      fontSize;
  929.   int       hideQTWAfterPlayingEdit;
  930.   
  931.   DeselectList();
  932.   strcpy(label, xv_get (ip->selectionLabelField, PANEL_VALUE));
  933.  
  934.   start = textWindowStart;
  935.   end   = textWindowEnd;
  936.  
  937.   mins = (int) atoi(xv_get (ip->DurationMinsTextField, PANEL_VALUE));
  938.   secs = (double) atof((char*)xv_get(ip->DurationSecsTextField, PANEL_VALUE));
  939.   duration = mins * 60.0 + secs;
  940.  
  941.   GetCurrentLocation(&locX, &locY);
  942.   GetCurrentSize(&sizeWidth, &sizeHeight);
  943.  
  944.   fontFamily = currentFontFamily;
  945.   fontStyle = currentFontStyle;
  946.   fontSize  = currentFontSize = xv_get(QuoteMaker_QuoteWindowSpecificationsPopup->FontSizeTextField,
  947.                        PANEL_VALUE);
  948.  
  949.   hideQTWAfterPlayingEdit = HideQTWAfterPlayingEdit;
  950.   
  951.   editList.start[editList.numItems] = start;                /* Add the new information to the edit list */
  952.   editList.end[editList.numItems] = end;
  953.   editList.duration[editList.numItems] = duration;
  954.   editList.locX[editList.numItems] = locX;
  955.   editList.locY[editList.numItems] = locY;
  956.   editList.sizeWidth[editList.numItems] = sizeWidth;
  957.   editList.sizeHeight[editList.numItems] = sizeHeight;
  958.   editList.fontFamily[editList.numItems] = fontFamily;
  959.   editList.fontStyle[editList.numItems] = fontStyle;
  960.   editList.fontSize[editList.numItems] = fontSize;
  961.   editList.hideQTWAfterPlayingEdit[editList.numItems] = hideQTWAfterPlayingEdit;
  962.   
  963.   if (editList.label[editList.numItems])                /* Free space taken by previous label */
  964.     free(editList.label[editList.numItems]);
  965.   editList.label[editList.numItems] = strdup(label);
  966.   editList.numItems++;                            /* Update number of items in the edit list */
  967.   xv_set (QuoteMaker_baseWindow->editListScrolledList,
  968.       PANEL_LIST_INSERT, editList.numItems-1,
  969.       PANEL_LIST_STRING, editList.numItems-1,
  970.       FormatEntry(editList.numItems, label, duration, hideQTWAfterPlayingEdit),
  971.       PANEL_LIST_FONT, editList.numItems-1, listFont,
  972.       NULL);
  973.  
  974.   UpdateNumEditsMessage();
  975.  
  976.   sprintf(msg , "%d", editList.numItems);
  977.   xv_set(QuoteMaker_baseWindow->currentSelectionNumberLabel, PANEL_LABEL_STRING, strdup(msg), NULL);
  978.   
  979.   unsavedChangesExist = YES;
  980.  
  981.   textsw_set_selection(QuoteMaker_textWindowPopup->mainTextPane,    /*  Highlight the selection (because the text_sw... */
  982.                textWindowStart, textWindowEnd + 1,        /*  ...will keep forgetting about it.               */
  983.                PRIMARY_SELECTION);
  984.  
  985.   xv_set(QuoteMaker_baseWindow->deleteButton, PANEL_INACTIVE, FALSE, NULL); /* Re-activate Modify and Delete buttons */
  986.   xv_set(QuoteMaker_baseWindow->modifyButton, PANEL_INACTIVE, FALSE, NULL);
  987.   xv_set(QuoteMaker_baseWindow->deleteAllButton, PANEL_INACTIVE, FALSE, NULL);
  988.  
  989.   xv_set(QuoteMaker_baseWindow->editListScrolledList,            /* Select the newly-added item */
  990.      PANEL_LIST_SELECT, editList.numItems-1, TRUE,NULL);
  991. }                                    /* end function AddSelection */
  992.  
  993.  
  994.  
  995. void ModifySelection(item, event)                    /* Notify callback function for `modifyButton'. */
  996.      Panel_item    item;
  997.      Event*        event;
  998. {
  999.   QuoteMaker_baseWindow_objects    *ip =                    /* In this case, ip points to the control panel... */
  1000.     (QuoteMaker_baseWindow_objects *) xv_get(item,            /* ...that contans the 'modifyButton' */
  1001.                          XV_KEY_DATA,
  1002.                          INSTANCE);
  1003.   int       selected;
  1004.   char       label[MAX_LABEL_LEN + 1];
  1005.   int       start;
  1006.   int       end;
  1007.   double   duration;
  1008.   int      locX;
  1009.   int      locY;
  1010.   int      sizeWidth;
  1011.   int      sizeHeight;
  1012.   int      mins;
  1013.   double   secs;
  1014.     
  1015.   selected = Selected();
  1016.   if (selected == NO_CURRENT_EDIT)                    /* Was a valid selection chosen to be modified? */
  1017.   {                                    /* No, no valid selection was chosen to be modified */
  1018.     notice_prompt (QuoteMaker_baseWindow->baseWindow, NULL,
  1019.            NOTICE_MESSAGE_STRINGS,
  1020.            "You need to select an edit before you can Modify it.",
  1021.            NULL,
  1022.            NOTICE_BUTTON,    "OK", 100,
  1023.            NULL);
  1024.     return;                                /* Exit this function without doing anything more */
  1025.   }
  1026.   strcpy(label,xv_get (ip->selectionLabelField, PANEL_VALUE));
  1027.  
  1028.   start = textWindowStart;
  1029.   end   = textWindowEnd;
  1030.   
  1031.   mins = (int) atoi(xv_get (ip->DurationMinsTextField, PANEL_VALUE));
  1032.   secs = (double) atof((char*)xv_get(ip->DurationSecsTextField, PANEL_VALUE));
  1033.   duration = mins * 60.0 + secs;
  1034.  
  1035.   GetCurrentLocation(&locX, &locY);
  1036.   GetCurrentSize(&sizeWidth, &sizeHeight);
  1037.  
  1038.   editList.start[selected] = start;
  1039.   editList.end[selected] = end;
  1040.   editList.duration[selected] = duration;
  1041.   editList.locX[selected] = locX;
  1042.   editList.locY[selected] = locY;
  1043.   editList.sizeWidth[selected] = sizeWidth;
  1044.   editList.sizeHeight[selected] = sizeHeight;
  1045.   editList.fontFamily[selected] = currentFontFamily;
  1046.   editList.fontStyle[selected] = currentFontStyle;
  1047.   editList.fontSize[selected] = xv_get(QuoteMaker_QuoteWindowSpecificationsPopup->FontSizeTextField,
  1048.                        PANEL_VALUE);
  1049.   currentFontSize = editList.fontSize[selected];
  1050.   
  1051.   editList.hideQTWAfterPlayingEdit[selected] = HideQTWAfterPlayingEdit;
  1052.   
  1053.   if (editList.label[selected])
  1054.     free(editList.label[selected]);
  1055.   editList.label[selected] = strdup(label);
  1056.   xv_set (QuoteMaker_baseWindow->editListScrolledList,
  1057.       PANEL_LIST_STRING, selected, FormatEntry(selected + 1, label, duration, HideQTWAfterPlayingEdit),
  1058.       PANEL_LIST_FONT, selected, listFont,
  1059.       NULL);
  1060.   unsavedChangesExist = YES;
  1061.   ClearEditModified();
  1062.  
  1063.   textsw_set_selection(QuoteMaker_textWindowPopup->mainTextPane,    /*  Highlight the selection (because the text_sw... */
  1064.                textWindowStart, textWindowEnd + 1,        /*  ...will keep forgetting about it.               */
  1065.                PRIMARY_SELECTION);
  1066. }                                    /* end function ModifySelection */
  1067.  
  1068.  
  1069.  
  1070.  
  1071.  
  1072. void DeleteSelection(item, event)                    /* Notify callback function for `deleteButton'. */
  1073.      Panel_item    item;
  1074.      Event        *event;
  1075. {
  1076.   int    selected;
  1077.   int   savedCurrentSelection;
  1078.   
  1079.   selected = Selected();
  1080.   if (selected == NO_CURRENT_EDIT)                    /* Was a valid selection chosen to be modified? */
  1081.   {                                    /* No, no valid selection was chosen to be modified */
  1082.     notice_prompt (QuoteMaker_baseWindow->baseWindow, NULL,
  1083.            NOTICE_MESSAGE_STRINGS,
  1084.            "You need to select an edit before you can Delete it.",
  1085.            NULL,
  1086.            NOTICE_BUTTON,    "OK", 100,
  1087.            NULL);
  1088.     return;                                /* Exit this function without doing anything more */
  1089.   }
  1090.  
  1091.   savedCurrentSelection = selected;
  1092.  
  1093. /***** I erased the deselect statement, and see if it works... **/
  1094.  
  1095.   xv_set (QuoteMaker_baseWindow->editListScrolledList,
  1096.       PANEL_LIST_DELETE, savedCurrentSelection,
  1097.       NULL);
  1098.   DeleteItemFromEditList(selected);
  1099.  
  1100.   ClearQuoteWindowSpecificationsPopup();
  1101.   
  1102.   UpdateNumEditsMessage();
  1103.  
  1104.   if (editList.numItems >= 1)
  1105.   {
  1106.     if (selected == editList.numItems)                    /* If it is the last item which got deleted...      */
  1107.     {
  1108.       xv_set(QuoteMaker_baseWindow->editListScrolledList,
  1109.          PANEL_LIST_SELECT, selected - 1, TRUE, NULL);
  1110.       SetCurrentSelection(selected - 1);
  1111.     }
  1112.     else
  1113.     {
  1114.       xv_set(QuoteMaker_baseWindow->editListScrolledList,
  1115.          PANEL_LIST_SELECT, selected, TRUE, NULL);
  1116.       SetCurrentSelection(selected);
  1117.     }
  1118.   }
  1119.   else
  1120.   {
  1121.     xv_destroy(QuoteMaker_baseWindow->editListScrolledList);
  1122.     QuoteMaker_baseWindow->editListScrolledList =
  1123.       QuoteMaker_baseWindow_editListScrolledList_create(QuoteMaker_baseWindow,
  1124.                             QuoteMaker_baseWindow->editListControlPanel);
  1125.     ResetCurrentSelection();
  1126.     
  1127.     xv_set(QuoteMaker_baseWindow->deleteButton, 
  1128.        PANEL_INACTIVE, TRUE, NULL);                    /* De-activate the Delete and Modify buttons */
  1129.     xv_set(QuoteMaker_baseWindow->modifyButton,
  1130.        PANEL_INACTIVE, TRUE, NULL);
  1131.     xv_set(QuoteMaker_baseWindow->deleteAllButton,
  1132.        PANEL_INACTIVE, TRUE, NULL);
  1133.   }
  1134.  
  1135.   unsavedChangesExist = YES;
  1136. }                                    /* end function DeleteSelection */
  1137.  
  1138.  
  1139.  
  1140.  
  1141. void DeleteAllSelections(item, event)                    /* Notify callback function for `deleteAllButton'. */
  1142.      Panel_item    item;
  1143.      Event*    event;
  1144. {
  1145.   DeselectList();
  1146.   ResetCurrentSelection();
  1147. /******
  1148.   EmptyList();
  1149. *****/
  1150.   xv_destroy(QuoteMaker_baseWindow->editListScrolledList);
  1151.   QuoteMaker_baseWindow->editListScrolledList =
  1152.     QuoteMaker_baseWindow_editListScrolledList_create(QuoteMaker_baseWindow,
  1153.                               QuoteMaker_baseWindow->editListControlPanel);
  1154.   editList.numItems = 0;
  1155.   UpdateNumEditsMessage();
  1156.   unsavedChangesExist = YES;
  1157.   xv_set(QuoteMaker_baseWindow->deleteButton,
  1158.      PANEL_INACTIVE, TRUE, NULL);                    /* De-activate the Delete and Modify buttons */
  1159.   xv_set(QuoteMaker_baseWindow->modifyButton,
  1160.      PANEL_INACTIVE, TRUE, NULL);
  1161.   xv_set(QuoteMaker_baseWindow->deleteAllButton,
  1162.      PANEL_INACTIVE, TRUE, NULL);
  1163.   
  1164.   ClearQuoteWindowSpecificationsPopup();
  1165. }                                    /* End function DeleteAllSelections */
  1166.  
  1167.  
  1168. Notify_value
  1169.   TextPaneEventHandler(win, event, arg, type)        /* Event callback function for `mainTextPane'. */
  1170. Xv_window    win;
  1171. Event        *event;
  1172. Notify_arg    arg;
  1173. Notify_event_type type;
  1174. {
  1175.   int   length;
  1176.  
  1177.   GetSelectionEndpoints(&textWindowStart, &textWindowEnd);
  1178.  
  1179.   if (event_id(event) == MS_LEFT || event_id(event) == MS_MIDDLE)
  1180.   {
  1181.     if (event_is_up(event))
  1182.     {
  1183.       CheckIfEditModified(TRUE);
  1184.       DisplayTextOnQuoteWindow();
  1185.     }
  1186.     else
  1187.     {
  1188.       length=xv_get(QuoteMaker_quotedTextBaseWindow->quotedTextPane, /* Get the number of characters currently in the... */
  1189.           TEXTSW_LENGTH);                    /* ...popup win. */
  1190.       if (length > 0)
  1191.       {
  1192.     textsw_delete(QuoteMaker_quotedTextBaseWindow->quotedTextPane, /* Erase any previously shown text in the Text... */
  1193.               0, length);                    /* popup window. */
  1194.     textsw_reset(QuoteMaker_quotedTextBaseWindow->quotedTextPane,0,0); /* Pretend that the QTW was never modified */
  1195.       }  
  1196.     }
  1197.   }
  1198.   
  1199.   return notify_next_event_func(win, (Notify_event) event, arg, type);
  1200. }                                    /* end function TextPaneEventHandler */
  1201.  
  1202.  
  1203. /*
  1204.  * Event callback function for `textWindowPopup'.
  1205.  */
  1206. Notify_value
  1207.   TextWindowPopupEventHandler(win, event, arg, type)
  1208. Xv_window    win;
  1209. Event        *event;
  1210. Notify_arg    arg;
  1211. Notify_event_type type;
  1212. {
  1213.   extern  QuoteMaker_textWindowPopup_objects *QuoteMaker_textWindowPopup;
  1214.  
  1215.   if (event_id(event) == LOC_WINENTER)
  1216.   {
  1217.     textsw_set_selection(QuoteMaker_textWindowPopup->mainTextPane, textWindowStart, textWindowEnd + 1,
  1218.              PRIMARY_SELECTION);
  1219.   }
  1220.   
  1221.   return notify_next_event_func(win, (Notify_event) event, arg, type);
  1222. }
  1223.  
  1224.  
  1225.  
  1226. /* ----------------------------------------------------------------------------
  1227.    Utilities: Popup support
  1228.    */
  1229.  
  1230.  
  1231. void Show (popup)
  1232.      Frame *popup;
  1233. {
  1234.   xv_set(*popup, FRAME_CMD_PUSHPIN_IN, TRUE, NULL);
  1235.   xv_set(*popup, XV_SHOW, TRUE, NULL);    
  1236. }                                    /* end function Show */
  1237.  
  1238.  
  1239. void Hide (popup)
  1240.      Frame *popup;
  1241. {
  1242.   if ((int)xv_get(*popup,FRAME_CMD_PUSHPIN_IN) == TRUE)            /* Is this frame's pushpin pushed in? */
  1243.     xv_set (*popup, FRAME_CMD_PUSHPIN_IN, FALSE, NULL);            /* Yes, take out the pushpin so the frame can be... */
  1244.                                     /* ...hidden.  */
  1245.   if ((int)xv_get(*popup, XV_SHOW) == TRUE)                /* Is this frame being shown? */
  1246.     xv_set (*popup,XV_SHOW, FALSE, NULL);                /* Yes, hide the frame */
  1247. }                                    /* end function Hide */
  1248.  
  1249.  
  1250.  
  1251. void GiveOneLastChanceToSave()
  1252. {
  1253.   char    message [MAX_MESSAGE_LEN + 1];
  1254.   int    response;
  1255.   char    shortOldEditListName [MAXPATHLEN + 1];
  1256.   
  1257.   strcpy (shortOldEditListName, (char *) xv_get(QuoteMaker_baseWindow->editListNameLabel, PANEL_LABEL_STRING));
  1258.   sprintf (message, "Save changes in '%s'?", shortOldEditListName);
  1259.   response = notice_prompt(QuoteMaker_baseWindow->baseWindow, NULL,
  1260.                NOTICE_MESSAGE_STRINGS,
  1261.                message,
  1262.                NULL,
  1263.                NOTICE_BUTTON_NO, "No",
  1264.                NOTICE_BUTTON_YES, "Yes",
  1265.                NULL);
  1266.   if (response == NOTICE_YES)
  1267.     WriteEditListToFile(absoluteEditListName, SAVE);
  1268. }                                    /* end function GiveOneLastChanceToSave */
  1269.  
  1270.  
  1271.  
  1272.  
  1273. void SetCurrentSelection(int entry)
  1274. {
  1275.   int     mins;
  1276.   double  secs;
  1277.   
  1278.   if (entry == NO_CURRENT_EDIT)
  1279.   {
  1280.     AlertByNoticePrompt(QuoteMaker_baseWindow->baseWindow,
  1281.             "Error:  There is no selected edit.  An edit must be selected first.");
  1282.   }
  1283.   HighlightSelection(editList.start[entry],
  1284.              editList.end[entry]);                /*  Show the selection over the text window.        */
  1285.   textWindowStart = editList.start[entry];
  1286.   textWindowEnd   = editList.end[entry];
  1287.   xv_set (QuoteMaker_baseWindow->selectionLabelField,PANEL_VALUE, strdup(editList.label[entry]),NULL);
  1288.   
  1289.   mins = (int)(floor(editList.duration[entry] / 60.0));
  1290.   secs = editList.duration[entry] - mins * 60.0;
  1291.   sprintf(msg, "%d", mins);
  1292.   xv_set (QuoteMaker_baseWindow->DurationMinsTextField, PANEL_VALUE, msg, NULL);
  1293.   sprintf(msg, "%.1lf", secs);
  1294.   xv_set (QuoteMaker_baseWindow->DurationSecsTextField, PANEL_VALUE, msg, NULL);
  1295.   
  1296.   sprintf(msg, "%d:%.1lf", mins, secs);                    /*  Display the endtime message in the duration...  */
  1297.   xv_set(QuoteMaker_baseWindow->EndTimeMessage,                /*  ...gauge.                                       */
  1298.      PANEL_LABEL_STRING, msg, NULL);
  1299.   
  1300.   sprintf(msg, "%d", entry+1);
  1301.   xv_set(QuoteMaker_QuoteWindowSpecificationsPopup->EditNumberMessage,
  1302.      PANEL_LABEL_STRING, msg, NULL);
  1303.   
  1304.   sprintf(msg, "%d x %d", editList.locX[entry], editList.locY[entry]);
  1305.   xv_set(QuoteMaker_QuoteWindowSpecificationsPopup->LocationMessage,
  1306.      PANEL_LABEL_STRING, msg, NULL);
  1307.   sprintf(msg, "%d x %d", editList.sizeWidth[entry], editList.sizeHeight[entry]);
  1308.   xv_set(QuoteMaker_QuoteWindowSpecificationsPopup->SizeMessage,
  1309.      PANEL_LABEL_STRING, msg, NULL);
  1310.   
  1311.   SetQuotedTextWindowLocation(editList.locX[entry],
  1312.                   editList.locY[entry]);
  1313.   SetQuotedTextWindowSize(editList.sizeWidth[entry],
  1314.               editList.sizeHeight[entry]);
  1315.   OldLocX = editList.locX[entry];                    /*  These values are used to ensure that the old... */
  1316.   OldLocY = editList.locY[entry];                    /*  ...loc and size values are updated so that...   */
  1317.   OldSizeWidth = editList.sizeWidth[entry];                /*  ...the "modified bit" will not be changed...    */
  1318.   OldSizeHeight = editList.sizeHeight[entry];                /*  ...because of the notify_interposer.            */
  1319.   
  1320.   SetFontPanel(editList.fontFamily[entry],
  1321.            editList.fontStyle[entry],
  1322.            editList.fontSize[entry]);
  1323.   xv_set(QuoteMaker_QuoteWindowSpecificationsPopup->FontSizeTextField,
  1324.      PANEL_VALUE, currentFontSize,
  1325.      NULL);
  1326.   if (editList.hideQTWAfterPlayingEdit[entry])
  1327.     EnableHideQTWAfterPlayingEdit();
  1328.   else
  1329.     DisableHideQTWAfterPlayingEdit();
  1330.   
  1331.   sprintf(msg,"%d",entry+1);
  1332.   xv_set (QuoteMaker_baseWindow->currentSelectionNumberLabel,
  1333.       PANEL_LABEL_STRING, strdup(msg),
  1334.       NULL);
  1335.   
  1336.   mostRecentEditNum = entry;
  1337.   xv_set(QuoteMaker_baseWindow->deleteButton,
  1338.      PANEL_INACTIVE, FALSE, NULL);                    /* Re-activate Modify and Delete buttons */
  1339.   xv_set(QuoteMaker_baseWindow->modifyButton,
  1340.      PANEL_INACTIVE, FALSE, NULL);
  1341. }                                    /* end function SetCurrentSelection */
  1342.  
  1343.  
  1344.  
  1345. char* FormatEntry(int        entryNum,
  1346.           char*        label,
  1347.           double    duration,
  1348.           int        hideQTWFlag)
  1349. {
  1350.   int       mins;
  1351.   double    secs;
  1352.   
  1353.   mins = (int)(floor(duration / 60.0));
  1354.   secs = duration - mins * 60.0;
  1355.   sprintf(msg, "%d:%.1lf", mins, secs);
  1356.   if (hideQTWFlag)
  1357.     sprintf(Entry, "%4d   %-15.15s      %s        YES", entryNum, label, msg);
  1358.   else
  1359.     sprintf(Entry, "%4d   %-15.15s      %s        NO", entryNum, label, msg);
  1360.   return(Entry);
  1361. }                                    /* end function FormatEntry */
  1362.  
  1363.  
  1364.  
  1365.  
  1366. void ResetCurrentSelection()
  1367. {
  1368.   xv_set (QuoteMaker_baseWindow->selectionLabelField, 
  1369.       PANEL_VALUE, "",
  1370.       NULL);  
  1371.   
  1372.   PutInDefaultDuration();
  1373.  
  1374.   ClearQuoteWindowSpecificationsPopup();
  1375.  
  1376. /************
  1377.   xv_set (QuoteMaker_baseWindow->numEditsLabel,
  1378.       PANEL_LABEL_STRING, "New Edit",
  1379.       NULL);
  1380. ************/
  1381.  
  1382.   UpdateNumEditsMessage();
  1383. }
  1384.  
  1385.  
  1386.  
  1387. void UpdateNumEditsMessage()
  1388. {
  1389.   int    size;
  1390.   char* sizeMessage;
  1391.   
  1392.   size = ListSize();
  1393.   sizeMessage = (char *) malloc (MAX_MESSAGE_LEN + 1);
  1394.   sprintf (sizeMessage, "Number of Edits: %d", size);
  1395.   xv_set (QuoteMaker_baseWindow->numEditsLabel,
  1396.       PANEL_LABEL_STRING, sizeMessage,NULL);
  1397. }
  1398.  
  1399.  
  1400. void Alert(callingObject,message)                    /* Puts up a dialog box with a message and on... */
  1401.      Xv_opaque    callingObject;                        /* ..."ok" button for acknowledgement. */
  1402.      char*    message;
  1403. {
  1404.   notice_prompt(callingObject, NULL,
  1405.         NOTICE_MESSAGE_STRINGS,
  1406.         message, NULL, NOTICE_BUTTON, "OK", 100, NULL);    
  1407. }                                    /* end function Alert */
  1408.  
  1409.  
  1410.  
  1411.  
  1412. char* ShortName (fileName)                        /* Given full path name, returns tail (the part... */
  1413.      char* fileName;                            /* ...after the last "/") */
  1414. {
  1415.   char* tempName;
  1416.   char*    rindex();
  1417.   
  1418.   tempName = rindex(fileName, '/');                    /* catch the last "/" in the path passed in as arg. */
  1419.   if (tempName == (char *)NULL)                        /* Was there a "/" in the path passed in? */
  1420.     tempName = fileName;                        /* No, just return the whole file passed in */
  1421.   else                                    /* Yes, there was a "/" in the path passed in */
  1422.     tempName = &tempName[1];                        /* Skip over the last "/" and return the following */
  1423.                                     /* string. */
  1424.   return (tempName);
  1425. }                                    /* end function ShortName */
  1426.  
  1427.  
  1428. void SetDocument(documentName)
  1429.      char*    documentName;
  1430. {
  1431.   char            frameTitle[1024];
  1432.  
  1433. /**********
  1434.   strcpy (shortName, ShortName(documentName));
  1435. **********/
  1436.   xv_set (QuoteMaker_baseWindow->docNameLabel,PANEL_LABEL_STRING,
  1437.       documentName,NULL);
  1438.   realpath(documentName, absoluteDocumentName);
  1439.   xv_set (QuoteMaker_textWindowPopup->mainTextPane,TEXTSW_FILE,
  1440.       absoluteDocumentName,NULL);
  1441.   sprintf(frameTitle,"QuoteMaker:  Annotating  '%s'", documentName);
  1442.   xv_set (QuoteMaker_textWindowPopup->textWindowPopup,            /* Change the label of the Text window's title bar */
  1443.       XV_LABEL, frameTitle,NULL);
  1444. }                                    /* end function SetDocument */
  1445.  
  1446.  
  1447. /*
  1448.  * Notify callback function for `HideQuoteWindowAfterPlayingEditSettingHandler'.
  1449.  */
  1450. void
  1451.   HideQuoteWindowAfterPlayingEditSettingHandler(item, value, event)
  1452. Panel_item    item;
  1453. int        value;
  1454. Event        *event;
  1455. {
  1456.   CheckIfEditModified(TRUE);
  1457.   
  1458.   HideQTWAfterPlayingEdit = value;
  1459. }
  1460.  
  1461.  
  1462. void
  1463. GetCurrentLocationHandler()
  1464. {
  1465.   static  Rect  tempRect;
  1466.   
  1467.   if (xv_get(QuoteMaker_quotedTextBaseWindow->quotedTextBaseWindow, XV_SHOW) == TRUE)
  1468.   {
  1469.     frame_get_rect(QuoteMaker_quotedTextBaseWindow->quotedTextBaseWindow,
  1470.            &tempRect);
  1471.  
  1472.     sprintf(msg, "%d x %d", tempRect.r_left, tempRect.r_top);
  1473.     xv_set(QuoteMaker_QuoteWindowSpecificationsPopup->LocationMessage,
  1474.        PANEL_LABEL_STRING, msg);
  1475.  
  1476. /********
  1477.     xv_set(QuoteMaker_QuoteWindowSpecificationsPopup->LocXTextField,
  1478.        PANEL_VALUE, tempRect.r_left, NULL);
  1479.     xv_set(QuoteMaker_QuoteWindowSpecificationsPopup->LocYTextField,
  1480.        PANEL_VALUE, tempRect.r_top, NULL);
  1481. **********/
  1482.   }
  1483. }
  1484.  
  1485.  
  1486. void
  1487.   GetCurrentSizeHandler()
  1488. {
  1489.   int        currentSizeWidth;
  1490.   int        currentSizeHeight;
  1491.   static Rect    tempRect;
  1492.  
  1493.   if (xv_get(QuoteMaker_quotedTextBaseWindow->quotedTextBaseWindow, XV_SHOW) == TRUE)
  1494.   {
  1495.     frame_get_rect(QuoteMaker_quotedTextBaseWindow->quotedTextBaseWindow,
  1496.            &tempRect);        
  1497.     currentSizeWidth = tempRect.r_width;
  1498.     currentSizeHeight = tempRect.r_height;
  1499.     sprintf(msg, "%d x %d", currentSizeWidth, currentSizeHeight);
  1500.     xv_set(QuoteMaker_QuoteWindowSpecificationsPopup->SizeMessage,
  1501.        PANEL_LABEL_STRING, msg);
  1502.  
  1503. /**********
  1504.     xv_set(QuoteMaker_QuoteWindowSpecificationsPopup->SizeWidthTextField,
  1505.        PANEL_VALUE, currentSizeWidth, NULL);
  1506.     xv_set(QuoteMaker_QuoteWindowSpecificationsPopup->SizeHeightTextField,
  1507.        PANEL_VALUE, currentSizeHeight, NULL);
  1508. **********/
  1509.   }
  1510. }
  1511.  
  1512.  
  1513.  
  1514. /*
  1515.  * Notify callback function for `FontFamilyList'.
  1516.  */
  1517. int
  1518.   FontFamilyNotifyHandler(item, string, client_data, op, event)
  1519. Panel_item    item;
  1520. char        *string;
  1521. Xv_opaque    client_data;
  1522. Panel_list_op    op;
  1523. Event        *event;
  1524. {
  1525.   int  i;
  1526.   int  oldFontFamily;
  1527.   int  selected;
  1528.     
  1529.   switch(op) {
  1530.    case PANEL_LIST_OP_DESELECT:
  1531.     break;
  1532.  
  1533.    case PANEL_LIST_OP_SELECT:
  1534.  
  1535.     oldFontFamily = currentFontFamily;
  1536.  
  1537.     for(i=0 ; i < MAX_NUM_OF_FONT_FAMILIES ; i++)
  1538.     {
  1539.       if (xv_get(QuoteMaker_QuoteWindowSpecificationsPopup->FontFamilyList,
  1540.          PANEL_LIST_SELECTED, i) == TRUE)
  1541.       {
  1542.     currentFontFamily = i;
  1543.     break;
  1544.       }
  1545.     }
  1546.     if (i == MAX_NUM_OF_FONT_FAMILIES) 
  1547.     {
  1548.       fprintf(stderr, "Error:  No font family selected.");
  1549.       exit(0);
  1550.     }
  1551.  
  1552.     if (oldFontFamily != currentFontFamily)
  1553.     {
  1554.       CheckIfEditModified(TRUE);
  1555.     }
  1556.     
  1557.     selected = Selected();
  1558.     if (selected != NO_CURRENT_EDIT)
  1559.     {
  1560.       SetQuotedTextWindowFont(currentFontFamily, currentFontStyle, currentFontSize);
  1561.     }
  1562.  
  1563.     break;
  1564.  
  1565.    case PANEL_LIST_OP_VALIDATE:
  1566.     fprintf(stderr, "QuoteMaker: FontFamilyNotifyHandler: PANEL_LIST_OP_VALIDATE: %s\n",string);
  1567.     break;
  1568.  
  1569.    case PANEL_LIST_OP_DELETE:
  1570.     fprintf(stderr, "QuoteMaker: FontFamilyNotifyHandler: PANEL_LIST_OP_DELETE: %s\n",string);
  1571.     break;
  1572.   }
  1573.   return XV_OK;
  1574. }
  1575.  
  1576. /*
  1577.  * Notify callback function for `FontStyleList'.
  1578.  */
  1579. int
  1580. FontStyleNotifyHandler(item, string, client_data, op, event)
  1581.     Panel_item    item;
  1582.     char        *string;
  1583.     Xv_opaque    client_data;
  1584.     Panel_list_op    op;
  1585.     Event        *event;
  1586. {
  1587.   int  i;
  1588.   int  oldFontStyle;
  1589.   int  selected;
  1590.      
  1591.   switch(op) {
  1592.    case PANEL_LIST_OP_DESELECT:
  1593.     break;
  1594.  
  1595.    case PANEL_LIST_OP_SELECT:
  1596.     oldFontStyle = currentFontStyle;
  1597.     
  1598.     for(i=0 ; i < MAX_NUM_OF_FONT_STYLES ; i++)
  1599.     {
  1600.       if (xv_get(QuoteMaker_QuoteWindowSpecificationsPopup->FontStyleList,
  1601.          PANEL_LIST_SELECTED, i) == TRUE)
  1602.       {
  1603.     currentFontStyle = i;
  1604.     break;
  1605.       }
  1606.     }
  1607.     if (i == MAX_NUM_OF_FONT_STYLES)
  1608.     {
  1609.       fprintf(stderr, "Error:  No font style selected.");
  1610.       exit(0);
  1611.     }
  1612.     if (oldFontStyle != currentFontStyle)
  1613.     {
  1614.       CheckIfEditModified(TRUE);
  1615.     }
  1616.  
  1617.     selected = Selected();
  1618.     if (selected != NO_CURRENT_EDIT)
  1619.     {
  1620.       SetQuotedTextWindowFont(currentFontFamily, currentFontStyle, currentFontSize);
  1621.     }
  1622.     
  1623.  
  1624.     break;
  1625.  
  1626.    case PANEL_LIST_OP_VALIDATE:
  1627.     break;
  1628.  
  1629.    case PANEL_LIST_OP_DELETE:
  1630.     break;
  1631.   }
  1632.   return XV_OK;
  1633. }
  1634.  
  1635.  
  1636. /*
  1637.  * Notify callback function for `FontSizeTextField'.
  1638.  */
  1639. Panel_setting
  1640. FontSizeNotifyHandler(item, event)
  1641.     Panel_item    item;
  1642.     Event        *event;
  1643. {
  1644.   int   select;
  1645.   int    value = (int) xv_get(item, PANEL_VALUE);
  1646.   
  1647.   currentFontSize = value;
  1648.   select = Selected();
  1649.  
  1650.   if (select != NO_CURRENT_EDIT)
  1651.   {
  1652.     CheckIfEditModified(TRUE);
  1653.   }
  1654.     
  1655.   if ((event_is_ascii(event) && (event_action(event) == '\n' ||        /*  The Quote Window font will be updated only when */
  1656.                 event_action(event) == '\r'))        /*  ...a return or line-feed is hit, or when one... */
  1657.     || event_is_button(event))                        /*  ...of the textfield "triangles" are pressed.    */
  1658.   {                                    
  1659.     SetQuotedTextWindowFont(currentFontFamily,
  1660.                 currentFontStyle,
  1661.                 currentFontSize);
  1662.   }
  1663.  
  1664.   return panel_text_notify(item, event);
  1665. }
  1666.  
  1667.  
  1668. /*
  1669.  * Notify callback function for `QTWSpecsDoneButton'.
  1670.  */
  1671. void
  1672. QTWSpecsDoneButtonHandler(item, event)
  1673.     Panel_item    item;
  1674.     Event        *event;
  1675. {
  1676.   Hide(&QuoteMaker_QuoteWindowSpecificationsPopup->QuoteWindowSpecificationsPopup);
  1677. }
  1678.  
  1679.  
  1680. void
  1681.   InitMainPanel()
  1682. {
  1683.   PutInDefaultDuration();
  1684.   notify_interpose_destroy_func(QuoteMaker_baseWindow->baseWindow,
  1685.                 DestroyBaseWindow);
  1686.   BlackColorIndex = gcm_color_index("black");
  1687.   GreenColorIndex = gcm_color_index("green");
  1688. }
  1689.  
  1690.  
  1691.  
  1692. void
  1693.   AlertByNoticePrompt(control, message)
  1694. Xv_Window    control;
  1695. char        *message;
  1696. {
  1697.   notice_prompt(control, NULL,
  1698.         NOTICE_MESSAGE_STRINGS, message, NULL,
  1699.         NOTICE_BUTTON, "OK", 'O',
  1700.         NULL);
  1701. }
  1702.  
  1703.  
  1704. /*
  1705.  * Notify callback function for `DurationMinsTextField'.
  1706.  */
  1707. Panel_setting
  1708.   DurationMinsTextFieldHandler(item, event)
  1709. Panel_item    item;
  1710. Event        *event;
  1711. {
  1712.   CheckIfEditModified(TRUE);
  1713.   
  1714.   return panel_text_notify(item, event);
  1715. }
  1716.  
  1717.  
  1718. /*
  1719.  * Notify callback function for `DurationSecsTextField'.
  1720.  */
  1721. Panel_setting
  1722.   DurationSecsTextFieldHandler(item, event)
  1723. Panel_item    item;
  1724. Event        *event;
  1725. {
  1726.   CheckIfEditModified(TRUE);
  1727.   
  1728.   return panel_text_notify(item, event);
  1729. }
  1730.